/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package laboratorio2;

public abstract class Lock2  implements Estructura  {
    
    //Atributos
    int[] clave; //listados para generar el largo de contrasenia
    private boolean estado;
    private int largo;
    private String bandera;
    
    //Constructores//
    public Lock2()//constructor de candado tipo estandar Clave:9-0-21-0
    {
        //Inicializa los atributos y clave estandar
        clave= new int[4];
        clave[0]= 9;
        clave[1]= 0;
        clave[2]= 21;
        clave[3]= 0;
        estado= false;
        largo=4;
        bandera="sin";
    }
    public Lock2(int largo)//constructor de candado de largo N.
    {
        //Inicializa los atributos e indica el largo de la clave que va ingresar el usuario. 
        clave= new int[largo];
        estado= false;
        this.largo=largo;
        bandera="con";
    }
    
    //Metodos//
    public String press(int [] claveVerificar)//Descripcion: este metodo es el mas largo ha este le ingresas una lista de tipo 
    //integer en su paremetro y tiene que primero verificar si lo numeros estan en el rango de 0 a 25, luego compara si 
    //es igual a clave que tiene el candado con la lista ingresada. Si es igual devolver se ha abierto el candado y de lo 
    //contrario indicar que que la clave ingresada es errone y bloquer todo el candado
    {
       int indice=0;//indice para verificar si el candado se abrio correctamente.
       if (this.getBandera().equals("sin"))//verifica si es el candado estandar.
       {
           for(int i=0;i<4;i++)//ciclo para comparar la lista que se le ingresa
           {
               if(claveVerificar[i]<0 || claveVerificar[i]>25)//comparacion si son numeros del rango correcto (de 0 a 25)
               {
                   this.setBandera("errorRango1");//si esta fuera de rango setea a que entre en error y bloquea el candado.
               } 
               else if (this.clave[i]==claveVerificar[i])//compara valores de memoria del candado con los ingresados.
               {
                   indice=indice++;//va sumando uno al indice 
               }
           }
           if (4==indice)//compara cantidad de igualdad en el codigo e indica si fue correcta o incorrecta.
               return("Clave Correcta, Candado abierto");//si no lo es bloquea candado
           else
               this.setBandera("errorRango1.2");//si no lo es bloquea candado
               return("Clave Incorrecta, Candado bloqueado resetear para volver a intentar");//mensaje de error.
       }

       if (this.getBandera().equals("con"))//verifica si es un candado modificado por el usuario.
       {
           for(int i=0;i<this.getLargo();i++)//ciclo para comparar la lista que se le ingresa
           {
               if(claveVerificar[i]<0 || claveVerificar[i]>25)//comparacion si son numeros del rango correcto (de 0 a 25)
               {
                   this.setBandera("errorRango2");//si esta fuera de rango setea a que entre en error y bloquea el candado.
               } 
               else if (this.clave[i]==claveVerificar[i])//compara valores de memoria del candado con los ingresados.
               {
                   indice=indice++;//va sumando uno al indice 
               }
           }
           if (this.getLargo()==indice)//compara cantidad de igualdad en el codigo e indica si fue correcta o incorrecta.
               return("Clave Correcta, Candado abierto");//si es correcto 
           else
               this.setBandera("errorRango2.2");//si no lo es bloquea candado
               return("Clave Incorrecta, Candado bloqueado resetear para volver a intentar");//mensaje de error.
       }
      //controladore de errores.
      if(this.getBandera().equals("errorRango1"))//error por numero fuera de rango 
        return ("Recuerde que solo puede ingresar numeros en un rando de 0 a 25, por lo tanto debe dale reset al candado y volver a intentar\nAdemas su clave fue incorrecta!");
      if(this.getBandera().equals("errorRango2.2"))//error por clave incorrecto
        return ("Recuerde que solo puede ingresar numeros en un rando de 0 a 25, por lo tanto debe dale reset al candado y volver a intentar\nAdemas su clave fue incorrecta!");
      
     return("EO1");//return de tramite.
    }
    public String reset()//Descripcion nueva: Este lo que hara dale un nuevo chance al usuario de poder ingresar 
    //nuevamente la clase osea si se equivoco le da reset y podra intetar meter otravez la clave-
    {
        if(this.getBandera().equals("errorRango1") || this.getBandera().equals("errorRango1.2"))//vertifica que estado es el candado 
        {
            this.setBandera("sin");//devuelve el tipo de candado estandar
            return ("Su candado Estandar fue reseteado.(Clave:9-0-21-0)");//mensaje que confirma el reset
        }
        else
        {
            this.setBandera("con");//devuelve el estado de candado modificado por el usurio
            return ("Su candado fue reseteado.");//mensaje de reseteado.
        }
    }
    public String isLocked()//Descripcion: es metodo solo indica en si esta abierto o cerrado el candado
    {
        if(this.getEstado()==false)//verifica el estado del candado 
            return("El estado del candado es CERRADO");//si esta cerrado.
        else
            return("El estado del candado es ABIERTO");//de lo contrario estara abierto.
    }
    public void lock()//Descripcion: cierra el candado y luego lo resetea totalmente!
    {
        this.setEstado(false);//funcion para resetear todo el candado.
    }
    public void ingresoClave(int[] claveUsuario)//Descripcion: este metodo recibe una lista de integer que es la que se guardad en la memoria del candado
    {
        this.setClave(claveUsuario);//ingreso de la candena a memoria del candado. 
    }
    
    //Set y Get
    public void setEstado(boolean estado)
    {
        this.estado=estado;
    }
    public void setLargo(int largo)
    {
        this.largo=largo;
    }
    public void setBandera(String bandera)
    {
        this.bandera=bandera;
    }
    public void setClave(int[] clave)
    {
        this.clave=clave;
    }
    public boolean getEstado()
    {
        return estado;
    }
    public int getLargo()
    {
        return largo;
    }
    public String getBandera()
    {
        return bandera;
    }
}

